#include <stdbool.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <sys/un.h> 
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <netinet/in.h> 
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <ctype.h>


#include "constantes.h"
#include "estructuras.h"
#include "NIPC.h"
#include "recibirComando.h"

extern int posicionCabezal;
	
extern chs glChs;
extern int glRPM;
char * algoritmo;


int recibircomando (int descriptor) {
	
	InfoIPC infoIPC;
	int comando;
	char *parametro;
	short enCache;
	int arSectores[MAX_QUANTITY_SECTORES] = {-1,-1,-1,-1,-1};
	int colageneral[MAX_QUANTITY_SECTORES] = {-1,-1,-1,-1,-1};
	int colaactiva[MAX_QUANTITY_SECTORES] = {-1,-1,-1,-1,-1};
	int colapasiva[MAX_QUANTITY_SECTORES] = {-1,-1,-1,-1,-1};
	int i,i2,a;
	int sectorInicial,sectorFinal;
	char *detener;
	int sector;
	char *datasector;
	int pvez;
	int sectoresverdaderos;
	int atendidos;
	int x;
	
   
	printf("Recibiendo comando .....\n");
	recibirIPC(descriptor, &infoIPC);
	comando=infoIPC.payLoadDescriptor;
	parametro = (char *)malloc(strlen(infoIPC.payload )+1);
	memcpy(parametro, infoIPC.payload,strlen(infoIPC.payload )+1);
	
	datasector=(char *)malloc(512);
	detener=(char *)malloc(50);
   
	printf("comando: %i \n",comando);
	printf("parametro: %s \n",parametro);
   
	
   
	switch(comando)
	{
		case TRACE:
		
			printf("Datos recibidos: TRACE\n");
			i = 1; 
			arSectores[0]= atoi(strtok(parametro," "));
			strcpy(detener,strtok(NULL," "));
	
			while((i<5)&&(strcmp(detener,"-1"))){
		 
				arSectores[i]= atoi(detener);   
				i++;
				
				if(i!=5)
					strcpy(detener,strtok(NULL," "));		
			}
		 
			i=0;
		 
			while(i<5){ 
		 
				printf("arSectores[%i]: %i \n",i,arSectores[i]);
				i=i+1;
			}
		 
	   
			while(arSectores[i]!=-1 && i<5 )
			{  
				if(dentroDeRango(arSectores[i],10000))
				{			
			   i++;
				}
				else
				{
					printf("> Sector fuera de rango\n> Sector nro %d: ",i+1);
				}
			}		
			 
			printf("POSICION ACTUAL: %i\n",posicionCabezal);
			
			if(!strcmp(algoritmo,"C-SCAN")){
				ordenarArrayCSCAN(arSectores,posicionCabezal);	
				posicionCabezal=trace(arSectores,posicionCabezal,glChs,glRPM);	
			}					
			else{
				for(i=0;i<MAX_QUANTITY_SECTORES;i++){
					colageneral[i]=arSectores[i];
				}
				i=0;
				pvez=1;
				sectoresverdaderos=0;
				i2=0;
				
				while(i<MAX_QUANTITY_SECTORES){
					if(colageneral[i]!=-1)							
						sectoresverdaderos++;
					i++;		
				}	

				atendidos=0;
				
				while(atendidos!=sectoresverdaderos){
					
					i=0;
					a=0;
					
					if(pvez){
					
						
						while((i<TAMACTIVA)&&(a<MAX_QUANTITY_SECTORES)){
							if(colageneral[a]!=-1)							
							{
								colaactiva[i]=colageneral[a];
								colageneral[a]=-1;
								i++;
							}
							a++;
						}
											
						
						pvez=0;
						atendidos=atendidos+i;
						
					}
					else
						atendidos=atendidos+i2;

					
			
					i=0;
					a=0;
					while((i<TAMPASIVA)&&(a<MAX_QUANTITY_SECTORES)){
						if(colageneral[a]!=-1)							
						{
							colapasiva[i]=colageneral[a];
							colageneral[a]=-1;
							i++;
						}
						a++;
					}
					i2=i;
										
					ordenarArraySCAN(colaactiva,posicionCabezal);	 
					posicionCabezal=trace(colaactiva,posicionCabezal,glChs,glRPM);
					
					for(i=0;i<MAX_QUANTITY_SECTORES;i++){
						colaactiva[i]=colapasiva[i];
					}
				
					
					for(i=0;i<MAX_QUANTITY_SECTORES;i++){
						colapasiva[i]=-1;
					}
					
					
					
				} 
			
			}  
			break;
		
		case INFO:
			
			printf("Datos recibidos: INFO\n");
			printf("POSICION ACTUAL: %i\n",posicionCabezal);
			break;
		
		case CLEAN:
				
			printf("Datos recibidos: CLEAN\n");
			sectorInicial= atoi(strtok(parametro," "));
			sectorFinal= atoi(strtok(NULL," "));
			clean(sectorInicial,sectorFinal);
			break;
		
		case(READ):
		
			printf("Datos recibidos: READ\n");	
			sector= atoi(strtok(parametro," "));
			readSector(sector);
			imprimirSector(sector);
			
			break;	
			
		case(WRITE):
	
			printf("Datos recibidos: WRITE\n");	
			sector= atoi(strtok(parametro," "));
			strcpy(datasector,strtok(NULL," "));
			writeSector(sector,datasector);

			break;	
	
	}	
	
	
	
   /*free(parametro);*/
   printf("\nMENU CONSOLA PPD \n");
   printf("------------------\n");
   
   printf("Ingrese alguno de los siguientes comandos\n\n");
   printf("1)trace S1 [S2 S3 S4 S5] \n");
   printf("2)info\n");
   printf("3)clean S1 S2\n");
   printf("4)read\n");
   printf("5)write\n");
   
   printf("\n");
   
   return EXITO; 
}


 
int dentroDeRango(int unSector, int sectores_totales_vda)
{ 
	int resultado=0;
	sectores_totales_vda--;
	if(unSector <= sectores_totales_vda && unSector >= 0)
	{
		resultado = 1;
	}

	return resultado;
}		

int esnum(char letra){
      
     if((isdigit(letra))) 
      return 0;
     
     return 1;   
}


